fastlane match
#fastlane
背景
コード署名は必要なものなのだけど、チーム開発におけるコード署名周りの管理は非常に手間がかかる。
新メンバーが追加された時
チームに新メンバーが増えた時、新規メンバーは以下を実施する必要がある。
1. 新メンバーは、KeyChain Certificate Assistnt にて、CSR (Certificate Signing Request) ファイルを作成する
2. 新メンバーは、作成した CSR を Account Center にアップロードする
3. 新メンバーは、Account Center から Certificate をダウンロードする
DL した Certificate は Keychain に追加する (これで Code Signing Identity として証明書情報が保管される)
4. 権利者は、Account Center 上の Provisioning Profile を更新する
手順 3 で追加した Certificate を Provisioning Profile に追加する
5. 新メンバーは、Provisioning Profile を何らかの経路で DL する
これは最初の一回だけだけど、手順が多いし、特に手順 4, 5 は権利者と連携して作業する必要がある。複数のメンバーが増えたら、権利者は複数のメンバー分作業が必要になる。
Xcode と署名
新しい端末が追加された時
典型的なコード署名のケースだと、Code Signing Identity 及び Provisioning Profile は各メンバー毎のマシン上にインストールされる。新しい端末が追加されると Provisioning Profile が更新されるので、各メンバーは個々人が Provisioning Profile を更新しにいく必要がある。また、通常、Provisioning Profile を直接 DL できるのは権利者のみで、各メンバーは権利者を通じて Provisioning Profile を何らかの方法で受け取る必要がある。これは各メンバーにとっても権利者にとっても手間になる。
Certification が expired になった時
Certification には有効期限があるので、それが切れると作り直す必要がある。この作り直す作業は手間だし、さらに Provisioning Profile の更新も必要になってしまう。ここでも新メンバーが追加された時や新しい端末が追加された時と同様の煩雑さがある。
fastlane match
概要
上述のような問題は、チームメンバーが個別に Code Signing Identity をローカルに保持し、個別に Certificate を作成し、共通の Provisioning Profile を利用しているために発生する。fastlane match はこの煩雑さを解決するために、単一の Git リポジトリに共通の Certificate, Code Signing Identity, Provisioning Profile を管理する。
各メンバーは更新された Certificate や Provisioning Profile を DL できれば良いので、Git リポジトリを read できる権限を持っていれば十分になる。Apple Develop Portal へのアクセス権が必要になるのは、管理者のみになる。
fastlane match では、この証明書情報の読み取りや更新を 1 コマンドで簡単に行える I/F を提供している。
https://codesigning.guide
前準備
以下を準備する必要がある。
証明書情報を格納する GitHub Private Repository
実は S3 などのクラウドストレージもサポートしている
ロール が App Manager 以上の Apple Developer アカウント
App ID
iOS アプリの App ID を Apple Developer Portal 上の Identity で作成する
fastlane produce というコマンドを用いて、Apple Developer Portal 及び App Store Connect 上で Identity 及びアプリを作成することもできる
fastlane match をどこで実行するか?
fastlane match を利用すると、成果物として MatchFile が出来上がる。ここに証明書のアップロード先のリポジトリの情報などの設定項目が諸々記述される。この時、fastlane match を実行する場所として、match で証明書を管理する対象の Xcode プロジェクト直下で行うこともできるし、Xcode プロジェクトから独立したリポジトリを個別に作って (証明書をアップロードするディレクトリとは別)、そこで fastlane match を実行することもできる。
Xcode プロジェクトと fastlane match のリポジトリを分離するかどうか?はケースバイケースだと思う。分けておいた方が事故が減るということもあるかもしれないし、Xcode プロジェクトと Fastfile が分離されるから fastlane match 側では常に最新の fastlane が利用できる!とかもあるかもしれない。
このノートでは、Xcode プロジェクト直下で fastlane match を利用するケースについて書く。
はじめての fastlane match
Matchfile
fastlane match の利用を開始する手軽な方法は、fastlane match init を実行することである。これを実行すると対話形式で必要な情報を入力することができ、入力結果を含んだ Matchfile が fastlane ディレクトリ配下に生成される。
Matchfile には init コマンド時に指定した設定値... 例えば、Git リポジトリを使う場合はその情報など、が記載されている。この他にも様々なオプションを記載することができる。ここに記載できるオプションは、同時に fastlane match コマンドに直接オプションとして指定することもできるようになっている。そのため、Matchfile 内に記載できる項目一覧を知りたければ fastlane match --help でヘルプを確認すると良い。
code:MatchFile
git_url("https://github.com/example/example-repo.git")
storage_mode("git")
type("development")
よく使いそうなオプションは以下。
table:MatchFile
オプション 概要
git_url matchで生成した証明書等を配置するリポジトリのURL
git_branch matchで生成した証明書等を配置するリポジトリのブランチ。デフォルトではmasterになる
app_identifier 証明書等を生成する対象のアプリのBundle Identifier。カンマ区切りで複数指定できる
証明書等の生成/更新 (権利者のやること)
次に、Certificate 及び Provisioning Profile を作成する。作成したい type を以下から指定できる。
appstore
adhoc
development
enterprise
developer_id
以下のように実行すると、Certificate 及び Provisioning Profile が生成される。また、各々を更新したい場合には同様のコマンドを実行すれば良い。
code:console
$ fastlane match development
$ fastlane match appstore
証明書等の取得 (メンバーのやること)
Certificate 及び Provisioning Profile の読み取りだけ行いたい場合、各メンバーは --readonly フラグを付与して各コマンドを実行すれば良い。
code:console
$ fastlane match development --readonly
$ fastlane match apps --reaonly
https://docs.fastlane.tools/actions/match/
Tips
Fastfile との連携
fastlane のアクションとして match あるいは sync_code_signing という名前で指定できる。
SSHのパスフレーズ入力が必要でちょっとハマった
SSH アクセスを利用していて、かつパスフレーズが設定されている場合、git clone が止まってしまう問題がある。解決策は以下のような感じ。
https://qiita.com/jollyjoester/items/e8df75f28b92eb90371c
https://qiita.com/evakichi/items/abb6dde9df78f049b913
参考
https://qiita.com/kotarella1110/items/840af2cf80aaea1fb035